package br.ufal.ic.p3.darv10.dominio;

import java.util.ArrayList;
import java.util.List;

import br.ufal.ic.p3.darv10.banco.Banco;
import br.ufal.ic.p3.darv10.excecao.DARExcecao;

public class Aluno {

	private String matriculaAluno;
	private String nomeAluno;
	private int creditosObrigatorio;
	private int creditosEletiva;
	private List<Disciplina> listaDisciplinasJaCursadas;
	private List<Disciplina> listaDisciplinasOferecidas;
	private List<Curso> listaCurso;

	public Aluno(){}
	
	public Aluno(String nomeAluno, String matriculaAluno, int creditosObrigatorio, int creditosEletiva){
		setNomeAluno(nomeAluno);
		setMatriculaAluno(matriculaAluno);
		setCreditosObrigatorio(creditosObrigatorio);
		setCreditosEletiva(creditosEletiva);
		setListaDisciplinasJaCursadas(new ArrayList<Disciplina>());
		setListaDisciplinasOferecidas(new ArrayList<Disciplina>());
		setListaCurso(new ArrayList<Curso>());
	}

	public void setMatriculaAluno(String matriculaAluno) {
		this.matriculaAluno = matriculaAluno;
	}

	public String getMatriculaAluno() {
		return matriculaAluno;
	}

	public void setNomeAluno(String nomeAluno) {
		this.nomeAluno = nomeAluno;
	}

	public String getNomeAluno() {
		return nomeAluno;
	}

	public void setCreditosObrigatorio(int creditosObrigatorio) {
		this.creditosObrigatorio = creditosObrigatorio;
	}

	public int getCreditosObrigatorio() {
		return creditosObrigatorio;
	}

	public void setCreditosEletiva(int creditosEletiva) {
		this.creditosEletiva = creditosEletiva;
	}

	public int getCreditosEletiva() {
		return creditosEletiva;
	}

	public void setListaDisciplinasJaCursadas(
			List<Disciplina> listaDisciplinasJaCursadas) {
		this.listaDisciplinasJaCursadas = listaDisciplinasJaCursadas;
	}

	public List<Disciplina> getListaDisciplinasJaCursadas() {
		return listaDisciplinasJaCursadas;
	}

	public void setListaDisciplinasOferecidas(
			List<Disciplina> listaDisciplinasOferecidas) {
		this.listaDisciplinasOferecidas = listaDisciplinasOferecidas;
	}

	public List<Disciplina> getListaDisciplinasOferecidas() {
		return listaDisciplinasOferecidas;
	}

	public void adicionarCurso(Curso c) {
		c.setAlunoAtivo(true);
		listaCurso.add(c);
	}

	public void adicionarDisciplinaJaCursada(Disciplina d) {
		listaDisciplinasJaCursadas.add(d);
	}

//	public boolean matricular(Disciplina d) throws DARExcecao {
//		if(aptoMatricula(d) && d.isOferecida()){
//			listaDisciplinasJaCursadas.add(d);
//			d.matricularAluno(this);
//			return true;
//		}
//		return false;
//	}

	public boolean aptoMatricula(Disciplina disciplina) throws DARExcecao{
		if(disciplina.verificaPreRequisito(creditosObrigatorio + creditosEletiva) &&
				checarPreRequisitos(disciplina.getListaDisciplinasPreRequisito()))
		{
			return true;
		}
		return false;
	}

	public void setListaCurso(List<Curso> listaCurso) {
		this.listaCurso = listaCurso;
	}

	public boolean checarPreRequisitos(List<Disciplina> listaDisciplinas) throws DARExcecao{

		if(listaDisciplinas.isEmpty()) {
			return true;
		}

		else {
			for(Disciplina dis : listaDisciplinas){
				if(!listaDisciplinasJaCursadas.contains(dis)){
					throw new DARExcecao("O aluno não possui os pré-requisitos necessários.");
				}
				else{
					return true;
				}
			}
		}

		return false;
	}

	public List<Curso> getListaCurso() {
		return listaCurso;
	}

	public Curso getCursoAtivo() {

		for(Curso curso : this.listaCurso) {
			if(curso.isAlunoAtivo()) {
				return curso;
			}
		}
		return null;
	}

	public boolean verificaDisciplinaCursada(Disciplina d){
		if(listaDisciplinasJaCursadas.contains(d)){
			return true;
		}
		return false;
	}
	
	public boolean verificaCursandoDisciplina(Disciplina d){
		if(listaDisciplinasOferecidas.contains(d)){
			return true;
		}
		return false;
	}
	
	public String toString(){
		return nomeAluno;
	}

	public List<Aluno> getAlunosBD() throws DARExcecao {
		Banco bd = Banco.getInstance();
		return bd.getAlunos();
	}
	
	public List<Disciplina> getDisciplinasPorAluno(){
		return this.getCursoAtivo().getSecretaria().getDepartamento().getListaDisciplinas();
	}
}
